package com.mwh.yuantu.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mwh.yuantu.core.ErrorMsg;
import com.mwh.yuantu.core.MindriveException;
import com.mwh.yuantu.entity.MediaInfoEntity;
import com.mwh.yuantu.entity.VideoInfoEntity;
import com.mwh.yuantu.parameter.VideoInfoParameter;
import com.mwh.yuantu.parameter.VideoInfoSearchParameter;
import com.mwh.yuantu.dto.VideoInfoDTO;
import org.springframework.beans.BeanUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.text.SimpleDateFormat;
import java.util.*;

/**
 * (VideoInfo)表服务接口
 *
 * @author maweihong
 * @since 2023-11-01 09:47:33
 */
@Service
@Slf4j
public class VideoInfoService extends BaseService {

    /**
     * 根据媒体信息主键，查询该视频下的所有播放集数，从大到小排序（后台管理专用）
     * @param mediaId 媒体信息主键
     * @return
     */
    public List<VideoInfoEntity> listByMediaIdDesc(String mediaId) {
        return iVideoInfoDAO.listByMediaIdDesc(mediaId);
    }

    /**
     * 根据媒体信息主键，查询该视频下的所有播放集数，从小到大排序（状态正常的）
     * @param mediaId 媒体信息主键
     * @return
     */
    public List<VideoInfoEntity> listByMediaId(String mediaId) {
        return iVideoInfoDAO.listByMediaId(mediaId);
    }

    /**
     * 根据主键查询信息
     * @param videoId 主键
     * @return
     */
    public VideoInfoEntity selectById(String videoId) {
        return iVideoInfoDAO.selectById(videoId);
    }

    /**
     * 根据主键查询信息（前台播放页面专用）
     * @param videoId 主键
     * @return
     */
    public VideoInfoEntity selectByIdWithPortal(String videoId) {
        // 获取视频信息（前台播放页面专用）
        VideoInfoEntity videoInfo = iVideoInfoDAO.selectByIdWithPortal(videoId);
        if (videoInfo!=null) {
            // 播放总量自增
            int nViewCount = videoInfo.getViewCount();
            nViewCount++;

            // 日播放量自增
            int nViewCountDay = videoInfo.getViewCountDay();
            nViewCountDay++;

            // 周播放量自增
            int nViewCountWeek = videoInfo.getViewCountWeek();
            nViewCountWeek++;

            // 月播放量自增
            int nViewCountMonth = videoInfo.getViewCountMonth();
            nViewCountMonth++;

            // 年播放量自增
            int nViewCountYear = videoInfo.getViewCountYear();
            nViewCountYear++;

            // 更新播放次数
            VideoInfoEntity videoInfo2 = new VideoInfoEntity();
            videoInfo2.setVideoId(videoInfo.getVideoId());
            videoInfo2.setViewCount(nViewCount);
            videoInfo2.setViewCountDay(nViewCountDay);
            videoInfo2.setViewCountWeek(nViewCountWeek);
            videoInfo2.setViewCountMonth(nViewCountMonth);
            videoInfo2.setViewCountYear(nViewCountYear);

            iVideoInfoDAO.update(videoInfo2);
        }

        return videoInfo;
    }

    /**
     * 视频播放地址保存
     * @param videoInfo
     */
    public void save(VideoInfoEntity videoInfo) {
        Date currentTime = new Date();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String now = formatter.format(currentTime);

        // 1.0 如果排序次数没填的话，则默认为1
        if (StringUtils.isEmpty(videoInfo.getSort())) {
            videoInfo.setSort(1);
        }

        // 2.0 如果播放总量没填的话，则默认为1
        if (StringUtils.isEmpty(videoInfo.getViewCount())) {
            videoInfo.setViewCount(1);
        }

        // 3.0 保存视频信息
        // 判断是新增还是更新
        if (StringUtils.isEmpty(videoInfo.getVideoId())) {
            // 新增
            videoInfo.setStatus(1);
            videoInfo.setUpdateTime(new Date());
            videoInfo.setViewCountDay(0);
            videoInfo.setViewCountWeek(0);
            videoInfo.setViewCountMonth(0);
            videoInfo.setViewCountYear(0);
            iVideoInfoDAO.insert(videoInfo);
        } else {
            // 更新
            iVideoInfoDAO.update(videoInfo);
        }

        // 4.0 更新对应的媒体的时间、状态等
        MediaInfoEntity mediaInfo = new MediaInfoEntity();
        mediaInfo.setMediaId(videoInfo.getMediaId());
        mediaInfo.setUpdateTime(currentTime);
        mediaInfo.setHasVideo(1);

        iMediaInfoDAO.updateMedia(mediaInfo);
    }

    /**
     * 更新统一封面
     * @param mediaId 媒体信息主键
     * @param image 图片地址
     */
    public void updateImage(String mediaId, String image) {
        iVideoInfoDAO.updateImage(mediaId, image);
    }

    /**
     * 批量更新排序
     * @param videoIdArr 主键数组
     * @param sortArr 排序数组
     */
    public void updateSort(String[] videoIdArr, String[] sortArr) {
        for (int i=0; i<videoIdArr.length; i++) {
            VideoInfoEntity videoInfo = new VideoInfoEntity();
            videoInfo.setVideoId(Integer.parseInt(videoIdArr[i]));
            videoInfo.setSort(Integer.parseInt(sortArr[i]));

            iVideoInfoDAO.update(videoInfo);
        }
    }

    /**
     * 批量更新视频状态
     * @param videoIdArr 主键数组
     * @param status 状态
     */
    public void batchUpdateStatus(String[] videoIdArr, String status) {
        iVideoInfoDAO.batchUpdateStatus(videoIdArr, status);
    }

    /**
     * 批量删除视频
     * @param videoIdArr 主键数组
     * @throws MindriveException
     */
    public void batchDelete(String[] videoIdArr) throws MindriveException {
        for (int i=0; i<videoIdArr.length; i++) {
            // 只有已经禁用的视频才可以被删除
            VideoInfoEntity videoInfo = iVideoInfoDAO.selectById(videoIdArr[i]);
            if ("1".equals(videoInfo.getStatus())) {
                throw new MindriveException(ErrorMsg.ERROR_600005);
            }
        }
        iVideoInfoDAO.batchDelete(videoIdArr);
    }

    /**
     * 根据视频主键查询视频播放源（电脑端）
     * @param videoId
     * @return
     */
    public String selectVideoPlayById(String videoId) {
        // 1.0 获取视频信息
        VideoInfoEntity videoInfo = iVideoInfoDAO.selectVideoPlayById(videoId);

        // 2.0 获取播放器配置参数
        String content = iPlayerInfoDAO.selectContentById(videoInfo.getPlayerId().toString());

        // 3.0 判断视频地址是否存在
        if (StringUtils.isEmpty(content)) {
            content = "";
        } else {
            if (StringUtils.isEmpty(videoInfo.getUrl())) {
                // 3.1 不存在时，不返回播放内容
                content = "";
            } else {
                // 3.2 存在时，替换播放器配置中的变量
                content = content.replace("{url}", videoInfo.getUrl());
            }
        }

        return content;
    }

    /**
     * 更新统一权限值
     * @param mediaId
     * @param power
     */
    public void updatePower(String mediaId, String power) {
        iVideoInfoDAO.updatePower(mediaId, power);
    }

    /**
     * 获取最新视频
     * @param count
     * @return
     * @throws MindriveException
     */
    public List<VideoInfoEntity> listNewVideo(String count) throws MindriveException {
        try {
            Integer.parseInt(count);
        } catch (NumberFormatException e) {
            throw new MindriveException(ErrorMsg.ERROR_700004);
        }
        return iVideoInfoDAO.listNewVideo(count);
    }

    /**
     * 清空视频点击量
     * @param videoInfo
     */
    public void clearViewCount(VideoInfoEntity videoInfo) {
        iVideoInfoDAO.clearViewCount(videoInfo);
    }

}

